前一篇是提到「在 SwiftUI 的 View 達成以 protocol 為 @ObservedObject 屬性的型別」,雖然本系列文章基本上沒有前後關聯,如果你是還沒讀過前一篇的讀者,也推薦你去讀讀。
有沒有遇過資料來源是 optional ,但是 SwiftUI 卻無法接受的情形?
在 UIKit ,像是 UITextField 的 text 是 optional ,但是在 SwiftUI 的 TextField ,是無法傳入的。
這時候就可以用 Biniding 做一層中介,在 Binding 的初始化進行 optional chaining 給予預設值,例如空字串。
struct CustomTextField: View {
@Binding var title: String?
var body: some View {
TextField("在這裡幫文章下個好標題...", text: Binding(get: {
title ?? ""
}, set: { newValue in
title = newValue.isEmpty ? nil : newValue
}))
}
}
使用時就像這樣:
struct ContentView: View {
@State var title: String?
var body: some View {
CustomTextField(title: $title)
}
}
在建立 custom UI 時可以活用這個方法,根據商業需求不同有可能會有 optional 的資料項,這時候就可以像這樣收納起來,在 UI 的最表層就不用看到很多 optional 的處理。
那今天的 SwiftUI 的大大小小就到這邊,以上,明天見!